home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / glibc108.zip / glibc108 / sysdeps / unix / sysv / __tcgetatr.c < prev    next >
C/C++ Source or Header  |  1992-04-10  |  5KB  |  170 lines

  1. /* Copyright (C) 1992 Free Software Foundation, Inc.
  2. This file is part of the GNU C Library.
  3.  
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Library General Public License as
  6. published by the Free Software Foundation; either version 2 of the
  7. License, or (at your option) any later version.
  8.  
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. Library General Public License for more details.
  13.  
  14. You should have received a copy of the GNU Library General Public
  15. License along with the GNU C Library; see the file COPYING.LIB.  If
  16. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  17. Cambridge, MA 02139, USA.  */
  18.  
  19. #include <ansidecl.h>
  20. #include <errno.h>
  21. #include <stddef.h>
  22. #include <sysv_termio.h>
  23. #include <termios.h>
  24. #include <sys/ioctl.h>
  25.  
  26. /* Put the state of FD into *TERMIOS_P.  */
  27. int
  28. DEFUN(__tcgetattr, (fd, termios_p),
  29.       int fd AND struct termios *termios_p)
  30. {
  31.   struct __sysv_termio buf;
  32.   int termio_speed;
  33.  
  34.   if (termios_p == NULL)
  35.     {
  36.       errno = EINVAL;
  37.       return -1;
  38.     }
  39.  
  40.   if (__ioctl (fd, _TCGETA, &buf) < 0)
  41.     return -1;
  42.  
  43.   termio_speed = buf.c_cflag & _SYSV_CBAUD;
  44.   termios_p->__ospeed =
  45.     (termio_speed == _SYSV_B0 ? 0 :
  46.      termio_speed == _SYSV_B50 ? 50 :
  47.      termio_speed == _SYSV_B75 ? 75 :
  48.      termio_speed == _SYSV_B110 ? 110 :
  49.      termio_speed == _SYSV_B134 ? 134 :
  50.      termio_speed == _SYSV_B150 ? 150 :
  51.      termio_speed == _SYSV_B200 ? 200 :
  52.      termio_speed == _SYSV_B300 ? 300 :
  53.      termio_speed == _SYSV_B600 ? 600 :
  54.      termio_speed == _SYSV_B1200 ? 1200 :
  55.      termio_speed == _SYSV_B1800 ? 1800 :
  56.      termio_speed == _SYSV_B2400 ? 2400 :
  57.      termio_speed == _SYSV_B4800 ? 4800 :
  58.      termio_speed == _SYSV_B9600 ? 9600 :
  59.      termio_speed == _SYSV_B19200 ? 19200 :
  60.      termio_speed == _SYSV_B38400 ? 38400 :
  61.      -1);
  62.   termios_p->__ispeed = termios_p->__ospeed;
  63.  
  64.   termios_p->c_iflag = 0;
  65.   if (buf.c_iflag & _SYSV_IGNBRK)
  66.     termios_p->c_iflag |= IGNBRK;
  67.   if (buf.c_iflag & _SYSV_BRKINT)
  68.     termios_p->c_iflag |= BRKINT;
  69.   if (buf.c_iflag & _SYSV_IGNPAR)
  70.     termios_p->c_iflag |= IGNPAR;
  71.   if (buf.c_iflag & _SYSV_PARMRK)
  72.     termios_p->c_iflag |= PARMRK;
  73.   if (buf.c_iflag & _SYSV_INPCK)
  74.     termios_p->c_iflag |= INPCK;
  75.   if (buf.c_iflag & _SYSV_ISTRIP)
  76.     termios_p->c_iflag |= ISTRIP;
  77.   if (buf.c_iflag & _SYSV_INLCR)
  78.     termios_p->c_iflag |= INLCR;
  79.   if (buf.c_iflag & _SYSV_IGNCR)
  80.     termios_p->c_iflag |= IGNCR;
  81.   if (buf.c_iflag & _SYSV_ICRNL)
  82.     termios_p->c_iflag |= ICRNL;
  83.   if (buf.c_iflag & _SYSV_IXON)
  84.     termios_p->c_iflag |= IXON;
  85.   if (buf.c_iflag & _SYSV_IXOFF)
  86.     termios_p->c_iflag |= IXOFF;
  87.   if (buf.c_iflag & _SYSV_IXANY)
  88.     termios_p->c_iflag |= IXANY;
  89.   if (buf.c_iflag & _SYSV_IMAXBEL)
  90.     termios_p->c_iflag |= IMAXBEL;
  91.  
  92.   termios_p->c_oflag = 0;
  93.   if (buf.c_oflag & OPOST)
  94.     termios_p->c_oflag |= OPOST;
  95.   if (buf.c_oflag & ONLCR)
  96.     termios_p->c_oflag |= ONLCR;
  97.   termios_p->c_cflag = 0;
  98.   switch (buf.c_cflag & _SYSV_CSIZE)
  99.     {
  100.     case _SYSV_CS5:
  101.       termios_p->c_cflag |= CS5;
  102.       break;
  103.     case _SYSV_CS6:
  104.       termios_p->c_cflag |= CS6;
  105.       break;
  106.     case _SYSV_CS7:
  107.       termios_p->c_cflag |= CS7;
  108.       break;
  109.     case _SYSV_CS8:
  110.       termios_p->c_cflag |= CS8;
  111.       break;
  112.     }
  113.   if (buf.c_cflag & _SYSV_CSTOPB)
  114.     termios_p->c_cflag |= CSTOPB;
  115.   if (buf.c_cflag & _SYSV_CREAD)
  116.     termios_p->c_cflag |= CREAD;
  117.   if (buf.c_cflag & _SYSV_PARENB)
  118.     termios_p->c_cflag |= PARENB;
  119.   if (buf.c_cflag & _SYSV_PARODD)
  120.     termios_p->c_cflag |= PARODD;
  121.   if (buf.c_cflag & _SYSV_HUPCL)
  122.     termios_p->c_cflag |= HUPCL;
  123.   if (buf.c_cflag & _SYSV_CLOCAL)
  124.     termios_p->c_cflag |= CLOCAL;
  125.   termios_p->c_lflag = 0;
  126.   if (buf.c_lflag & _SYSV_ISIG)
  127.     termios_p->c_lflag |= _ISIG;
  128.   if (buf.c_lflag & _SYSV_ICANON)
  129.     termios_p->c_lflag |= _ICANON;
  130.   if (buf.c_lflag & _SYSV_ECHO)
  131.     termios_p->c_lflag |= _ECHO;
  132.   if (buf.c_lflag & _SYSV_ECHOE)
  133.     termios_p->c_lflag |= _ECHOE;
  134.   if (buf.c_lflag & _SYSV_ECHOK)
  135.     termios_p->c_lflag |= _ECHOK;
  136.   if (buf.c_lflag & _SYSV_ECHONL)
  137.     termios_p->c_lflag |= _ECHONL;
  138.   if (buf.c_lflag & _SYSV_NOFLSH)
  139.     termios_p->c_lflag |= _NOFLSH;
  140.   if (buf.c_lflag & _SYSV_TOSTOP)
  141.     termios_p->c_lflag |= _TOSTOP;
  142.   if (buf.c_lflag & _SYSV_ECHOKE)
  143.     termios_p->c_lflag |= ECHOKE;
  144.   if (buf.c_lflag & _SYSV_ECHOPRT)
  145.     termios_p->c_lflag |= ECHOPRT;
  146.   if (buf.c_lflag & _SYSV_ECHOCTL)
  147.     termios_p->c_lflag |= ECHOCTL;
  148.   if (buf.c_lflag & _SYSV_FLUSHO)
  149.     termios_p->c_lflag |= FLUSHO;
  150.   if (buf.c_lflag & _SYSV_PENDIN)
  151.     termios_p->c_lflag |= PENDIN;
  152.   if (buf.c_lflag & _SYSV_IEXTEN)
  153.     termios_p->c_lflag |= IEXTEN;
  154.  
  155.   termios_p->c_cc[VEOF] = buf.c_cc[_SYSV_VEOF];
  156.   termios_p->c_cc[VEOL] = buf.c_cc[_SYSV_VEOL];
  157.   termios_p->c_cc[VEOL2] = buf.c_cc[_SYSV_VEOL2];
  158.   termios_p->c_cc[VERASE] = buf.c_cc[_SYSV_VERASE];
  159.   termios_p->c_cc[VKILL] = buf.c_cc[_SYSV_VKILL];
  160.   termios_p->c_cc[VINTR] = buf.c_cc[_SYSV_VINTR];
  161.   termios_p->c_cc[VQUIT] = buf.c_cc[_SYSV_VQUIT];
  162.   termios_p->c_cc[VSTART] = '\021'; /* XON (^Q).  */
  163.   termios_p->c_cc[VSTOP] = '\023'; /* XOFF (^S).  */
  164.   termios_p->c_cc[VSUSP] = '\0'; /* System V release 3 lacks job control.  */
  165.   termios_p->c_cc[VMIN] = buf.c_cc[_SYSV_VMIN];
  166.   termios_p->c_cc[VTIME] = buf.c_cc[_SYSV_VTIME];
  167.  
  168.   return 0;
  169. }
  170.